package com.hsurosy.hsuchain.nft.auth.controller;

import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil;
import com.hsurosy.hsuchain.nft.api.notice.response.NoticeResponse;
import com.hsurosy.hsuchain.nft.api.notice.service.NoticeFacadeService;
import com.hsurosy.hsuchain.nft.auth.exception.AuthException;
import com.hsurosy.hsuchain.nft.auth.param.LoginParam;
import com.hsurosy.hsuchain.nft.auth.param.RegisterParam;
import com.hsurosy.hsuchain.nft.auth.vo.LoginVO;
import com.hsurosy.hsuchain.nft.web.vo.Result;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;

import static com.hsurosy.hsuchain.nft.api.notice.constant.NoticeConstant.CAPTCHA_KEY_PREFIX;
import static com.hsurosy.hsuchain.nft.auth.exception.AuthErrorCode.VERIFICATION_CODE_WRONG;

/**
 * 认证相关接口
 *
 * @Author Hsu琛君珩
 * @Date 2024-10-05 19:28
 * @Description
 * @Version: v1.0.0
 */
@Slf4j
@RequiredArgsConstructor
@RestController
@RequestMapping("auth")
public class AuthController {

    @Autowired
    private StringRedisTemplate redisTemplate; // Redis 模板类，用于缓存验证码等临时信息

    @DubboReference(version = "1.0.0")
    private NoticeFacadeService noticeFacadeService; // Dubbo 服务，用于发送短信验证码

    /**
     * 默认登录超时时间：7天
     */
    private static final Integer DEFAULT_LOGIN_SESSION_TIMEOUT = 60 * 60 * 24 * 7;

    /**
     * 发送短信验证码
     *
     * @param telephone 接收验证码的手机号码
     * @return 发送结果
     */
    @GetMapping("/sendCaptcha")
    public Result<Boolean> sendCaptcha(@NotBlank String telephone) {
        // 调用 NoticeFacadeService 发送短信验证码
        NoticeResponse noticeResponse = noticeFacadeService.generateAndSendSmsCaptcha(telephone);
        return Result.success(noticeResponse.getSuccess());
    }

    /**
     * 用户注册
     *
     * @param registerParam 包含手机号、验证码、邀请码等信息的注册参数
     * @return 注册是否成功
     */
    @PostMapping("/register")
    public Result<Boolean> register(@Valid @RequestBody RegisterParam registerParam) {
        // 验证码校验
        // 从 Redis 中获取存储的验证码
        // 校验验证码是否正确
        // 注册逻辑调用，例如调用 userService 进行用户注册
        // 清除验证码

        // 注册成功返回结果
        return Result.success(true);
    }

    /**
     * 用户登录
     *
     * @param loginParam 登录参数，包含手机号和验证码
     * @return 登录结果，包含用户的登录信息和令牌
     */
    @PostMapping("/login")
    public Result<LoginVO> login(@Valid @RequestBody LoginParam loginParam) {
        // 查询用户信息
        // 校验验证码或密码（根据具体的登录逻辑）
        // 登录成功后使用 Sa-Token 进行登录操作
        // 生成登录成功的返回信息
        LoginVO loginVO = new LoginVO();
        return Result.success(loginVO);
    }

    /**
     * 用户登出
     *
     * @return 登出结果
     */
    @PostMapping("/logout")
    public Result<Boolean> logout() {
        // 调用 Sa-Token 的登出操作
        return Result.success(true);
    }

}
